Python의 날짜 및 시간 관련 패키지 소개

datetime 패키지

  • 서브 패키지
    • datetime 클래스 : 날짜+시간 복합 정보
    • date 클래스: 날짜 정보
    • time 클래스: 시간 정보
    • timedelta 클래스: 시간 차이 정보
    • tzinfo 클래스: 시간대 정보

In [1]:
import datetime

datetime.datetime 클래스

  • 날짜와 시간 정보를 가지는 객체
  • Class Methods
    • now([tz]): 현재 시각
    • strptime(date_string, format): 문자열 -> datetime
    • fromtimestamp(): timestamp -> datetime
    • fromordinal(ordinal): proleptic Gregorian ordinal (엑셀 날짜) -> datetime
    • combine(date, time): date + time -> datetime

현재시각


In [2]:
dt = datetime.datetime.now()
dt


Out[2]:
datetime.datetime(2016, 4, 15, 11, 51, 32, 454636)

In [3]:
type(dt)


Out[3]:
datetime.datetime
  • Instance Attributes 속성
    • year, month, day, hour, minute, second, microsecond
    • tzinfo
  • Instance Methods 메소드
    • weekday(): 요일 {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}
    • strftime(format): datetime -> 문자열
    • toordinal(): datetime -> proleptic Gregorian ordinal (엑셀 날짜)
    • date(): datetime -> date
    • time(): datetime -> time

In [4]:
dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo


Out[4]:
(2016, 4, 15, 11, 51, 32, 454636, None)

In [5]:
dt.weekday() #  {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}


Out[5]:
4

문자열 변환

  • Parsing
    • 문자열 -> datetime
    • strptime(date_string, format)
  • Formatting
    • datetime -> 문자열
    • strftime(format)

In [6]:
dt1 = datetime.datetime.strptime("2015-12-31 11:32", "%Y-%m-%d %H:%M")
dt1


Out[6]:
datetime.datetime(2015, 12, 31, 11, 32)

In [7]:
dt1.strftime("%d/%m/%y")


Out[7]:
'31/12/15'

In [8]:
dt1.strftime("%A %d. %B %Y")


Out[8]:
'Thursday 31. December 2015'

In [9]:
s = dt1.strftime(u"%Y년 %m월 %d일 %H시 %M분 %S초".encode("utf-8"))
print(s)


2015년 12월 31일 11시 32분 00초

datetime, date, time 변환

  • datetime -> date 또는 time
    • date() 메소드 또는 time() 메소드
  • date + time -> datetime
    • combine() 메소드

In [10]:
dt = datetime.datetime.now()
dt


Out[10]:
datetime.datetime(2016, 4, 15, 11, 51, 32, 528052)

In [11]:
dt.date(), dt.time()


Out[11]:
(datetime.date(2016, 4, 15), datetime.time(11, 51, 32, 528052))

In [12]:
d = datetime.date(2015, 12, 31)
d


Out[12]:
datetime.date(2015, 12, 31)

In [13]:
t = datetime.time(11, 31, 29)
t


Out[13]:
datetime.time(11, 31, 29)

In [14]:
datetime.datetime.combine(d, t)


Out[14]:
datetime.datetime(2015, 12, 31, 11, 31, 29)

timedelta와 날짜시간 연산

  • 빼기

    • datetime - datetime => timedelta
  • 더하기

    • datetime + timedelta => datetime

In [15]:
dt1 = datetime.datetime(2016, 2, 19, 14)
dt2 = datetime.datetime(2016, 1, 2, 13)
td = dt1 - dt2
td


Out[15]:
datetime.timedelta(48, 3600)

timedelta 클래스

  • 속성

    • days: 일수
    • seconds: 초. (0 ~ 86399)
    • microseconds: 마이크로초 (0 and 999999)
  • 메소드

    • total_seconds(): 모든 속성을 초단위로 모아서 변환

In [16]:
td.days, td.seconds, td.microseconds


Out[16]:
(48, 3600, 0)

In [17]:
td.total_seconds()


Out[17]:
4150800.0

time 패키지

sleep 함수

  • 일정 시간 동안 프로세스 정지

In [18]:
import time
print("start...")
time.sleep(1)
print(1)
time.sleep(1)
print(2)
time.sleep(1)
print(3)
time.sleep(1)
print(4)
time.sleep(1)
print("finish!")


start...
1
2
3
4
finish!

time 패키지의 시간 표시

  • time_struct
    • 9-tuple 내부 구조체
  • 단일 부동소수점 숫자
    • 시간을 하나의 숫자로 표시 가능
    • time 패키지의 모든 시각은 epoch로부터 흐른 초단위 숫자로 표시
    • epoch
    • 1970년 1월 1일 0시 기준

time package 명령어

  • time(): 현재 시각을 단일 부동소수점 숫자로 반환
  • localtime(): 현재 시각을 time_struct로 반환
  • mktime(ts): time_struct -> 단일 부동소수점 숫자 변환

In [19]:
time.time()


Out[19]:
1460721097.600416

In [20]:
ts = time.localtime()
ts


Out[20]:
time.struct_time(tm_year=2016, tm_mon=4, tm_mday=15, tm_hour=11, tm_min=51, tm_sec=37, tm_wday=4, tm_yday=106, tm_isdst=0)

In [21]:
time.mktime(ts)


Out[21]:
1460721097.0

pytz 패키지

  • 세계 시간대 변환

In [22]:
import pytz

In [23]:
seoul = pytz.timezone("Asia/Seoul")

datetime 객체에 시간대 정보 넣기

  • localize 메소드

In [24]:
t1 = datetime.datetime.now()
t1


Out[24]:
datetime.datetime(2016, 4, 15, 11, 51, 37, 656818)

In [25]:
lt1 = seoul.localize(t1)
lt1


Out[25]:
datetime.datetime(2016, 4, 15, 11, 51, 37, 656818, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)

In [26]:
t2 = datetime.datetime.utcnow()
t2


Out[26]:
datetime.datetime(2016, 4, 15, 11, 51, 37, 671166)

In [27]:
lt2 = pytz.utc.localize(t2)
lt2


Out[27]:
datetime.datetime(2016, 4, 15, 11, 51, 37, 671166, tzinfo=<UTC>)

In [28]:
lt2 = t2.replace(tzinfo=pytz.utc)
lt2


Out[28]:
datetime.datetime(2016, 4, 15, 11, 51, 37, 671166, tzinfo=<UTC>)

타시간대로 변환

  • astimezone 메소드

In [29]:
t1 = datetime.datetime.now()
lt1 = seoul.localize(t1)
lt3 = lt1.astimezone(pytz.timezone("US/Eastern"))
lt3


Out[29]:
datetime.datetime(2016, 4, 14, 22, 51, 37, 691870, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

dateutil

  • parse 함수
  • relativedelta 클래스

parse() 함수

  • 많이 사용되는 날짜 시간 관련 문자열 형식을 스스로 판단

In [1]:
from dateutil.parser import parse

In [3]:
parse('2016-04-16')


Out[3]:
datetime.datetime(2016, 4, 16, 0, 0)

In [10]:
parse("Apr 16, 2016 04:05:32 PM")


Out[10]:
datetime.datetime(2016, 4, 16, 16, 5, 32)

In [12]:
parse('6/7/2016')


Out[12]:
datetime.datetime(2016, 6, 7, 0, 0)